home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Linux Cubed Series 8: LINUX Games
/
Linux Cubed Series 8 - LINUX Games.iso
/
games
/
x11
/
strategy
/
xpat2-1.000
/
xpat2-1
/
xpat2-1.04
/
src
/
r_Calculatio.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-22
|
3KB
|
119 lines
/*****************************************************************************/
/* */
/* */
/* X patience version 2 -- module r_Calculation.c */
/* */
/* Characteristics of the ``Calculation'' rules */
/* written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */
/* 04-Apr-1994 */
/* see COPYRIGHT.xpat2 for Copyright details */
/* */
/* */
/*****************************************************************************/
#include "xpatgame.h"
#define A 1
#define J 11
#define Q 12
#define K 13
static int order[4][13] = {
{ A,2,3,4,5,6,7,8,9,10,J,Q,K },
{ 2,4,6,8,10,Q,A,3,5,7,9,J,K },
{ 3,6,9,Q,2,5,8,J,A,4,7,10,K },
{ 4,8,Q,3,7,J,2,6,10,A,5,9,K } };
static void Calc_newgame(void) {
int i;
/* specific part: all cards on the vdeck, except 4 starting cards */
for (i = 0; i <= VDECK; ++i)
game.ind[i] = rules.numstacks * rules.faceup;
game.ind[IDECK] = rules.numcards;
for (i = 0; i < rules.numstacks; ++i)
game.ind[i] = i * rules.faceup;
for (i = 0; i < rules.numstacks; ++i) {
/* swap cards such that first cards are OK */
int j, rem;
for (j = 0; j < rules.faceup; ++j) {
int h;
rem = rules.numcards;
do
--rem;
while (RANK(game.cards[rem]) != order[i&3][j] - 1);
h = game.cards[i*rules.faceup+j];
game.cards[i*rules.faceup+j] = game.cards[rem];
game.cards[rem] = h;
}
}
for (i = 0; i < rules.numcards; ++i)
game.visible[i] = 1;
}
static int Calc_movevalid(Cardindex src, Pileindex dst) {
switch (game.piletype[dst]) {
case Stack:
return RANK(game.cards[src]) + 1 == order[dst&3][CARDS_ON_PILE(dst)];
case Slot:
return game.piletype[getpile(src)] == FaceupDeck;
default:
return 0;
}
}
static int Calc_good_hint(Cardindex src, Pileindex dst) {
switch (game.piletype[dst]) {
case Stack:
return 100;
case Slot:
return 1; /* do not display */
default:
return 0;
}
}
static void Calc_check(void) {
if (rules.faceup >= 13) {
fprintf(stderr, "Calculation cannot be played with more than 12 faceup cards!\n");
exit(EXIT_FAILURE);
}
}
struct rules Calculation_rules = {
"Calculation",/* shortname */
NULL, /* longname */
"calc", /* abbrev */
0, /* layout_hints */
DECK_SOURCE|STACKS_MULTI|NODEAL,/* variant */
CUSTOM_FACEUP,/* customizable */
0, /* customized */
52, /* numcards */
4, /* numstacks */
4, /* numslots */
0, /* numtmps */
1, /* numdecks */
13, /* cards_per_color */
0, /* numjokers */
{0, 0, 0, 0},/* param[0], param[1], param[2], param[3] */
0, /* facedown */
1, /* faceup */
0, /* newgame_bits */
Calc_newgame,/* new_game */
NULL, /* game_won */
NULL, /* new_cards */
MG_NONE|ST_ONE|DC_ALWAYS, /* move_bits */
NULL, /* deal_cards */
NULL, /* undeal_cards */
NULL, /* stackable */
Calc_movevalid,/* movevalid */
NULL, /* valid */
NULL, /* relaxed_valid */
Calc_good_hint,/* good_hint */
NULL, /* automove */
NULL, /* score */
0, /* maxscore */
{0, 0, 0, 0}, /* paramstring blocks */
0, /* used */
Calc_check, /* initfunc */
NULL, /* local keyboard bindings */
};